/**
 * Description:数据模型，将当前页面的所有数据节点建立一个树形结构的数据模型，用于与服务器交互数据
 * Copyright: 成都和为科技有限公司 2012
 */
function DataModel(tag) {
	this._tag = tag; //模型标示
	this._children = new Array(); //子模型
	this._units = new Array(); //数据节点数组
	this._record = new Object();//保存每个节点的值
}

/**
 * 初始化方法
 */
DataModel.prototype.init = function () {
}


DataModel.prototype.getTag = function () {
	return this._tag;
}

/**
 * 设置数据状态
 */
DataModel.prototype.setFlag = function (flag) {
	this._flag = flag;
}

/**
 * 增加子模型
 */
DataModel.prototype.addChild = function (dm) {
	this._children[this._children.length] = dm;
}

/**
 * 获得子模型
 */
DataModel.prototype.getChild = function (num) {
	return this._children[num];
}

/**
 * 增加数据元
 */
DataModel.prototype.addUnit = function (du) {
	this._units[this._units.length] = du;
}

/**
 * 得到数据元
 */
DataModel.prototype.getUnit = function (num) {
	return this._units[num];
}

/**
 * 获得数据集
 */
DataModel.prototype.getUnits = function () {
	return this._units;
}

/**
 * 获得记录值对象
 */
DataModel.prototype.getRecord = function(){
	return this._record;
}

/**
 * 为数据模型的所有数据单元绑定值
 * @param {} oDAta
 */
DataModel.prototype.bind = function(oData) {
	this._record = oData;
	for (var i = 0 ; i < this._units.length ; i++) {
		var oUnit = this._units[i];
		
		var value = this.convertValue(oUnit, oData);
		
		//在这里触发初始化方法
		var onInitData = oUnit._control.getAttribute()["oninitdata"];
		if (onInitData) {
			var newValue = oUnit._control.bindEvent(
				oUnit._control.getScriptValue(onInitData), value, oUnit, oData, this);
			if (typeof(newValue) != "undefined") value = newValue;
		}
        oUnit.setValue(value, oData);
        //增加初始化数据之后出发事件
        var afterinitData = oUnit._control.getAttribute()["afterinitdata"];
        if(afterinitData) oUnit._control.bindEvent(oUnit._control.getScriptValue(afterinitData), value, oUnit, oData, this);
        
	}
}

DataModel.prototype.convertValue = function(oUnit, oData) {
	var tags = oUnit.getTag().split(".");
	var value = oData;
	for (var j = 0 ; j < tags.length ; j++) {
		if (typeof(value) == "object" 
		    && value != null
			&& typeof(value[tags[j]]) != "undefined") {
			value = value[tags[j]];
		} else {
			return "";
		}
	}
	return value;
}

DataModel.prototype.reverseValue = function(oUnit, oData) {
	var tags = oUnit.getTag().split(".");
	var value = oData;
	for (var j = 0 ; j < tags.length ; j++) {
		if (j == (tags.length - 1)) {
			value[tags[j]] = oUnit.getValue(oData);
		} else {
			if (!value[tags[j]]) {
				value[tags[j]] = new Object();
			}
			value = value[tags[j]];
		}
	}
}

/**
 * 将数据模型的所有数据单元值卸载
 */
DataModel.prototype.unbind = function() {
	this._record = new Object();
	for (var i = 0 ; i < this._units.length ; i++) {
		var oUnit = this._units[i];
		oUnit.setValue("");
	}
	//清空子模型
	for (var i = 0 ; i < this._children.length ; i++) {
		var oChild = this._children[i];
		oChild.unbind();
	}
}

/**
 * 判断整个数据模型中所有控件是否认证通过
 */
DataModel.prototype.checkValidate = function() {
	for (var i = 0 ; i < this._units.length ; i++) {
		var oControl = this._units[i].getControl();
//		if(oControl.isValidate() != false){//等于false的是已经验证不通过的，不用再去根据validate再次检查
			oControl.validate();
//		}
		
		if (!oControl.isValidate() ) {
			oControl.showError();
			return false;
		}
	}
	for (var i = 0 ; i < this._children.length ; i++) {
		var oChild = this._children[i];
		var flag = oChild.checkValidate();
		if (!flag) {
			return flag;
		}
	}
	return true;
}

/**
 * 获得所有控件值和属性
 */
DataModel.prototype.getData = function() {
	var oData = new Object();
	for (var i = 0 ; i < this._units.length ; i++) {
		var oUnit = this._units[i];
//		var sTag = oUnit.getTag();
//        oData[sTag] = oUnit.getValue(oData);
		this.reverseValue(oUnit, oData);
	}
	return oData;
}


/**
 * 设置所有具有path的控件不可编辑
 */
DataModel.prototype.setDisable = function() {
	for (var i = 0 ; i < this._units.length ; i++) {
		var oUnit = this._units[i];
		oUnit.getControl().setDisable();
	}
}

/**
 * 检测是否修改
 */
DataModel.prototype.hasModify = function() {
	for (var i = 0 ; i < this._units.length ; i++) {
		var oUnit = this._units[i];
		if (oUnit.getControl().getType() == "Label") {
			continue;
		}
		if (oUnit.getOldValue() != oUnit.getValue()) {
			if (typeof(oUnit.getValue()) == "object") continue;
			if(oUnit.getValue() == "/public.common/webapi/images/common/no_img.png") continue;
			return true;
		}
	}
	return false;
}